package org.example.leetcode;

import java.util.ArrayList;
import java.util.*;
/**
 * @version 1.0.0
 * @author: lynn
 * @description:
 * @date: 2021/7/28 10:02
 */
public class LC29 {
    public static void main(String[] args) {
        LC29 lc=new LC29();
        System.out.println(lc.divide(-2147483648,1));
    }
    //fixme https://www.bilibili.com/video/BV1wa4y1H7pe?from=search&seid=16069328074912580799
    //溢出的情况 比如说 正数 2147483647 ,负数 -2147483648 这种情况下 Integer.MIN / -1  就会溢出，要额外判断下
    public int divide(int dividend, int divisor) {
        // nums >>shift = nums/(2^shift)
        //nums<<shift = nums*(2^shift);

        if (dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
        Boolean flag=(dividend>0 && divisor<0) || (dividend<0 && divisor>0);  // true 代表负数
        int res=0;
        //fixme 为什么要转成long 就是为了预防 出现Integer.MIN_VAL;
        long a=Math.abs((long)dividend); //fixme 这个地方里面要是没有long的话，会溢出
        long b=Math.abs((long)divisor);
        int shift=31;
        while (a>=b){
            while (a<b<<shift){
                shift--;
            }
            a=a-(b<<shift);//fixme 这个地方注意下
            res=res+(1<<shift);//fixme why? 10=3*2^0+3*2^1=3*(2^0+2^1);
        }
        return flag?-res:res;
    }
}
